#include "fvCFD.H"

int main(int argc, char *argv[])
{
    // ===
    // 帮助信息
    argList::addNote
    (
        "展示如何处理命令行参数\n"
        "\n"
        "输入参数:\n"
        "----------------\n"
        "  someWord - 没啥用的字符串\n"
        "  someScalar - 更没用的数字\n"
    );

    // 必要参数列表
    argList::noParallel();
    argList::validArgs.append("someWord");
    argList::validArgs.append("someScalar");

    // 可选参数
    argList::addOption // 字符串
    (
        "dict",
        "word",
        "一个dictionary的路径（没用）"
    );

    argList::addBoolOption // 一个开关，参数为空
    (
            "someSwitch",
            "一个开关"
    );

    argList::addOption // 整型
    (
        "someInt",
        "label",
        "一个整数"
    );

    // ===
    // 创建参数列表 argList
    // 这就是setRootCase.H所做的
    // 等效于#include "setRootCase.H"
    Foam::argList args(argc, argv);
    if (!args.checkRootCase())
    {
        Foam::FatalError.exit();
    }

    // ===
    // 读入参数
    const word someWord = args[1];
    // NOTE: 使用了内建的字符串转到其他数据类型的方法
    const scalar someScalar = args.get<scalar>(2);

    Info << "得到字符串参数 " << someWord << " 和标量 " << someScalar << endl;

    // ===
    // 读入可选参数

    // 初始化一个并不存在的默认地址
    fileName dictPath("./system/defaultDict");

    // 判断参数是否传入而选择性执行
    if (args.found("dict"))
    {
        args.readIfPresent("dict", dictPath);
        Info << "覆盖默认的dictionary地址" << endl;
    }
    Info << "从这个文件读取： " << dictPath << endl;

    // 开关指令
    const bool someConstBool = args.found("someSwitch");
    Info << "Boolean 设置为 " << someConstBool << endl;

    // 和string基本一样的做法
    label someInt(0);
    args.readIfPresent("someInt", someInt);
    Info << "整数参数： " << someInt << endl;

    Info << "End\n" << endl;

    return 0;
}

// ************************************************************************* //
